package ar.com.tallerdos.smartdinner.adapter;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.TextView;
import ar.com.tallerdos.smartdinner.R;
import ar.com.tallerdos.smartdinner.activity.ComidaActivity;
import ar.com.tallerdos.smartdinner.business.PedidoBusiness;
import ar.com.tallerdos.smartdinner.model.Pedido;
import ar.com.tallerdos.smartdinner.model.Pedido.PedidoEstado;
import ar.com.tallerdos.smartdinner.sync.NotificadorPedido;
import ar.com.tallerdos.smartdinner.util.DialogHandler;

public class PedidoExpandableAdapter extends BaseExpandableListAdapter {

    private ComidaActivity comidaActivity;
    private List<Pedido> pedidos;

    public PedidoExpandableAdapter(ComidaActivity context, List<Pedido> pedidos) {
	this.comidaActivity = context;
	this.pedidos = pedidos;
    }

    @Override
    public int getGroupCount() {
	return pedidos.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
	return 1;
    }

    @Override
    public Object getGroup(int groupPosition) {
	return pedidos.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
	return pedidos.get(groupPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
	return pedidos.get(groupPosition).getId();
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
	return 0;
    }

    @Override
    public boolean hasStableIds() {
	return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
	    View convertView, ViewGroup parent) {

	String headerTitle = ((Pedido) getGroup(groupPosition)).toString();
	if (convertView == null) {
	    LayoutInflater infalInflater = (LayoutInflater) this.comidaActivity
		    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	    convertView = infalInflater.inflate(
		    android.R.layout.simple_expandable_list_item_1, null);
	}
	TextView txt1 = (TextView) convertView.findViewById(android.R.id.text1);
	txt1.setText(headerTitle);

	return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
	    boolean isLastChild, View convertView, ViewGroup parent) {

	if (convertView == null) {
	    LayoutInflater infalInflater = (LayoutInflater) this.comidaActivity
		    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	    convertView = infalInflater.inflate(R.layout.pedido_expandable_row,
		    null);
	}

	final Pedido pedido = pedidos.get(groupPosition);

	TextView precioTextView = (TextView) convertView
		.findViewById(R.id.precioUnitario);
	precioTextView.setText(pedido.getProducto().getPrecioDosDecimales());

	final TextView cantidadTextView = (TextView) convertView
		.findViewById(R.id.cantidadProductos);
	cantidadTextView.setText(pedido.getCantidad().toString());

	Button sacar = (Button) convertView.findViewById(R.id.menosCantidad);
	Button agregar = (Button) convertView.findViewById(R.id.masCantidad);

	if (PedidoEstado.Nuevo.equals(pedido.getEstado())) {
	    agregar.setBackground(convertView.getResources().getDrawable(
		    R.drawable.custom_button));
	    sacar.setBackground(convertView.getResources().getDrawable(
		    R.drawable.custom_button));
	    sacar.setOnClickListener(new OnClickListener() {
		@Override
		public void onClick(View v) {
		    if (pedido.getCantidad() > 1) {

			pedido.setCantidad(pedido.getCantidad() - 1);
			cantidadTextView.setText(pedido.getCantidad()
				.toString());
			comidaActivity.recalcularTotal();
		    }

		}
	    });

	    agregar.setOnClickListener(new OnClickListener() {
		@Override
		public void onClick(View v) {
		    pedido.setCantidad(pedido.getCantidad() + 1);
		    cantidadTextView.setText(pedido.getCantidad().toString());
		    comidaActivity.recalcularTotal();
		}
	    });
	} else {
	    agregar.setOnClickListener(new NopClickListener());
	    agregar.setBackground(convertView.getResources().getDrawable(
		    R.drawable.custom_button_disabled));
	    sacar.setOnClickListener(new NopClickListener());
	    sacar.setBackground(convertView.getResources().getDrawable(
		    R.drawable.custom_button_disabled));
	}

	Button confirmarPedido = (Button) convertView
		.findViewById(R.id.confirmarPedido);
	Button cancelarPedido = (Button) convertView
		.findViewById(R.id.cancelarPedido);
	if (PedidoEstado.Nuevo.equals(pedido.getEstado())) {
	    confirmarPedido.setVisibility(View.VISIBLE);
	    confirmarPedido.setTag(pedido);
	    confirmarPedido.setOnClickListener(new ConfirmarPedidoListener());
	    cancelarPedido.setVisibility(View.VISIBLE);
	    cancelarPedido.setTag(pedido);
	    cancelarPedido.setOnClickListener(new CancelarPedidoListener());
	} else {
	    confirmarPedido.setVisibility(View.INVISIBLE);
	    cancelarPedido.setVisibility(View.INVISIBLE);
	}

	TextView estadoTextView = (TextView) convertView
		.findViewById(R.id.estadoValue);
	estadoTextView.setText(pedido.getEstado().name());

	return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
	return false;
    }

    private class ConfirmarPedidoListener implements OnClickListener {
	@Override
	public void onClick(View view) {
	    DialogHandler appdialog = new DialogHandler();
	    appdialog.Confirm(PedidoExpandableAdapter.this.comidaActivity, 
		    view.getResources().getString(R.string.pedidoConfirmarDialogHeader), 
		    view.getResources().getString(R.string.pedidoConfirmarDialogMsg),
		    new ConfirmarPedidoRunnable(view), new NopRunnable());
	}
    }
    
    private class ConfirmarPedidoRunnable implements Runnable {
	private View boton;
	
	public ConfirmarPedidoRunnable(View boton) {
	    this.boton = boton;
	}

	@Override
	public void run() {
	    Button cancelarPedido = (Button) ((View) this.boton.getParent())
		    .findViewById(R.id.cancelarPedido);
	    Button confirmarPedido = (Button) ((View) this.boton.getParent())
		    .findViewById(R.id.confirmarPedido);

	    Pedido pedido = (Pedido) confirmarPedido.getTag();
	    pedido.setEstado(PedidoEstado.Pendiente);

	    PedidoBusiness.update(pedido);
	    confirmarPedido.setVisibility(View.INVISIBLE);
	    cancelarPedido.setVisibility(View.INVISIBLE);
		
	    NotificadorPedido notifSync = new NotificadorPedido(pedido);
	    notifSync.execute();
	    PedidoExpandableAdapter.this.notifyDataSetChanged();
	}
	
    }

    private class CancelarPedidoListener implements OnClickListener {
	@Override
	public void onClick(View view) {
	    DialogHandler appdialog = new DialogHandler();
	        appdialog.Confirm(PedidoExpandableAdapter.this.comidaActivity, 
	        	view.getResources().getString(R.string.pedidoCancelarDialogHeader), 
	        	view.getResources().getString(R.string.pedidoCancelarDialogMsg),
	                new CancelarPedidoRunnable(view), new NopRunnable());
	}
    }
    
    private class CancelarPedidoRunnable implements Runnable {
	private View boton;
	
	public CancelarPedidoRunnable(View boton) {
	    this.boton = boton;
	}

	@Override
	public void run() {
	    Button cancelarPedido = (Button) this.boton
		    .findViewById(R.id.cancelarPedido);

	    Pedido pedido = (Pedido) cancelarPedido.getTag();

	    PedidoBusiness.delete(pedido);
	    PedidoExpandableAdapter.this.pedidos.remove(pedido);
	    PedidoExpandableAdapter.this.comidaActivity.recalcularTotal();
	    PedidoExpandableAdapter.this.notifyDataSetChanged();	    
	}
	
    }

    private class NopClickListener implements OnClickListener {

	@Override
	public void onClick(View view) {
	    // No hace nada
	}
    }
    
    private class NopRunnable implements Runnable {
	@Override
	public void run() {
	    // No hace nada
	}
    }

}
